package reflecct;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @classname:FieldDemo
 * @description:
 * @author: Mr.Z
 * @date: 2020/12/23 19:34
 * @version: 0.1
 * @since:1.8
 */
public class FieldDemo {

    public static void main(String[] args) {
        filed();
    }

    public static User filed() {
        //自动装配User对象
        String name = "jim";
        String pass = "1234";
        String phone = "12312415";
        //集合接收所有数据
        Map<String, Object> params = new HashMap<>(16);
        params.put("name", name);
        params.put("pass", pass);
        params.put("phone", phone);

        //操作的是Class文件----->通过反射创建对象（并将数据装配到对象里面）
        try {
            //1.获得Class对象
            Class<?> aClass = Class.forName("reflecct.User");
            //2.创建User对象. 默认是对象的无参构造方法创建对象
            User user = (User) aClass.newInstance();

            //学习框架 一定要提供无惨构造
            //3.将数据注入到对象
            //3.1直接访问属性

            //私有属性也可以访问到
            //Field[] declaredFields = aClass.getDeclaredFields();


            //只可以获得到public修饰的属性
            //Field[] fields = aClass.getFields();

            params.forEach((fieldKey, fildValue) -> {
                //找到具体的Filed对象
                try {
                    //找到具体的Filed对象
                    Field field = aClass.getDeclaredField(fieldKey);
                    //对属性赋值 set(Object obj ,Object obj)  obj对象  value属性数据
                    //开启访问私有权限
                    field.setAccessible(true);
                    field.set(user, fildValue);
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            });
            return user;

            //3.2执行set方法(setter注入)
        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }

}
